package com.mayikt.main.consumer;

import com.alibaba.fastjson.JSONObject;
import com.mayikt.main.api.impl.entity.SysUser;
import com.mayikt.main.api.impl.entity.SysUserLoginLog;
import com.mayikt.main.api.impl.mapper.SysUserMapper;
import com.mayikt.main.manage.WechatTemplateManage;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.List;

/**
 * @author 余胜军
 * @ClassName WechatTemplateConsumer
 * @qq 644064779
 * @addres www.mayikt.com
 * 微信:yushengjun644
 */
@Component
@RabbitListener(queues = "fanout_wechattemplate_queue")
@Slf4j
public class WechatTemplateConsumer {

    @Autowired
    private WechatTemplateManage wechatTemplateManage;
    @Autowired
    private SysUserMapper sysUserMapper;

    //    @RabbitHandler
//    public void process(String msg, Channel channel) {
//        log.info(">>调用微信模板接口发送微信模板提醒:{}<<", msg);
//        // 解析json
//        SysUserLoginLog sysUserLoginLog = JSONObject.parseObject(msg, SysUserLoginLog.class);
//        Integer userId = sysUserLoginLog.getUserId();
//        // 在用户userid实时查询对应手机号码和openid
//        SysUser sysUser = sysUserMapper.selectById(userId);
//        boolean result = wechatTemplateManage.sendLoginTemplate(sysUser, sysUserLoginLog);
//        if (!result) {
//            // 该msg 不能够从mq删除 mq服务器端给mq消费者触发重试策略
//            // 手动抛出异常----
//            return;
//        }
//        // 发送微信模板消息成功了 再通知mq服务器端删除该msg
//    }
    @RabbitHandler
    public void process(String msg, Channel channel, Message message) throws IOException {
        log.info(">>调用微信模板接口发送微信模板提醒:{}<<", msg);
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            List<SysUserLoginLog> sysUserLoginLogs = JSONObject.parseArray(msg, SysUserLoginLog.class);
            for (SysUserLoginLog sysUserLoginLog : sysUserLoginLogs) {
                // 解析json
                // SysUserLoginLog sysUserLoginLog = JSONObject.parseObject(msg, SysUserLoginLog.class);
                Integer userId = sysUserLoginLog.getUserId();
                // 在用户userid实时查询对应手机号码和openid
                SysUser sysUser = sysUserMapper.selectById(userId);
                boolean result = wechatTemplateManage.sendLoginTemplate(sysUser, sysUserLoginLog);
                if (!result) {
                    // 该msg 不能够从mq删除 mq服务器端给mq消费者触发重试策略
                    // 手动抛出异常----
                    //            int j = 1 / 0;
                    channel.basicNack(deliveryTag, true, true); // 给mq发送通知 这个msg消息消费失败了 需要重试！ 不会从mq删除
                    return;
                }
                // 发送微信模板消息成功了 再通知mq服务器端删除该msg

            }
            channel.basicAck(deliveryTag, true);// 手动ack成功 发送通知给 mq服务器端说 消费成功了 msg 从mq服务器端删除
        } catch (Exception e) {
            log.error("<e:>{}", e);
            channel.basicNack(deliveryTag, true, true); // 给mq发送通知 这个msg消息消费失败了 需要重试！ 不会从mq删除
        }

    }
    /**
     * 如果消费者消费msg 一直是失败---网络连接超时 可以重试
     * 但是如果是代码bug  将该msg 存入在另外一个队列中（死信队列）中   重新变写新消费者消费。
     */

}
